package controllers

import (
	"ExchangeApp/global"
	"errors"
	"github.com/gin-gonic/gin"
	"github.com/go-redis/redis"
	"net/http"
)

// LikeArticle 处理文章点赞请求
// @Summary 文章点赞
// @Description 为指定文章增加点赞数，使用Redis进行原子操作
// @Tags 点赞
// @Produce json
// @Param id path string true "文章ID"
// @Success 200 {object} map[string]string
// @Failure 500 {object} map[string]string
// @Router /like/article/{id} [post]
func LikeArticle(ctx *gin.Context) {
	// 1. 从URL路径参数中获取文章ID (例如：/like/article/123 中的 123)
	articleID := ctx.Param("id")

	// 2. 拼接生成存储在Redis中的键名，用于记录该文章的点赞数
	likeKey := "article:" + articleID + ":likes"

	// 3. 对指定键的值执行原子性+1操作（点赞）
	if err := global.RedisDb.Incr(likeKey).Err(); err != nil {
		// Redis操作失败，返回内部服务器错误
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 4. 点赞成功，返回200状态码和成功信息
	ctx.JSON(http.StatusOK, gin.H{"message": "Liked successfully"})
}

// GetArticleLikes 获取文章点赞数
// @Summary 获取文章点赞数
// @Description 查询指定文章的当前点赞数
// @Tags 点赞
// @Produce json
// @Param id path string true "文章ID"
// @Success 200 {object} map[string]string
// @Failure 500 {object} map[string]string
// @Router /like/article/{id} [get]
func GetArticleLikes(ctx *gin.Context) {
	// 获取文章ID路径参数
	articleID := ctx.Param("id")

	// 构造Redis中存储点赞数的键名
	likeKey := "article:" + articleID + ":likes"
	// 从Redis获取该文章的点赞数
	likes, err := global.RedisDb.Get(likeKey).Result()

	// 处理Redis查询结果
	if errors.Is(err, redis.Nil) {
		// 键不存在，表示还没有点赞，设为0
		likes = "0"
	} else if err != nil {
		// Redis查询出错
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 成功获取点赞数，返回200状态码和点赞数据
	ctx.JSON(http.StatusOK, gin.H{
		"likes": likes,
	})
}
